const fs = require('fs').promises; // 改用异步文件操作模块
const path = require('path');
const logger = require('../logger')

/**
 * 技能名称配置管理类,负责 skill_names.json 的加载、保存和修改
 * 异步改造：load/save 改为 async 方法,支持并行加载；保留核心配置失败终止程序的特性
 */
class SkillNames {
    /**
     * 构造函数
     * @param {string} configDir - 配置文件所在的目录路径
     */
    constructor(configDir) {
        this.skillNamesMap = {}; // 变量名使用小写开头（遵循JavaScript变量命名规范）
        this.configPath = path.join(configDir, 'skill_names.json');
    }

    /**
     * 异步加载技能配置文件（核心改造：async + 异步IO）
     * - 严格模式：文件不存在或格式错误会终止程序（核心配置必需）
     * @returns {Promise<void>} 加载完成的Promise（失败时reject）
     */
    async load() {
        try {
            // 异步检查文件是否存在（替代 fs.existsSync）
            await fs.access(this.configPath);

            // 异步读取文件（替代 fs.readFileSync）
            const data = await fs.readFile(this.configPath, 'utf8');
            const config = JSON.parse(data);

            // 配置验证（逻辑不变,严格校验）
            if (!config.skill_names || typeof config.skill_names !== 'object') {
                throw new Error('配置文件格式错误,缺少 skill_names 字段或类型不正确');
            }
            if (Object.keys(config.skill_names).length === 0) {
                throw new Error('配置文件内容为空,请至少添加一条技能配置');
            }

            this.skillNamesMap = config.skill_names;
            logger.info(`✅技能配置加载完成（${Object.keys(this.skillNamesMap).length}条）`);
        } catch (err) {
            // 核心配置加载失败：报错并终止程序（逻辑不变,保留严格模式）
            const errMsg = err?.message || "未知错误";
            logger.error('❌ 技能配置加载失败,程序无法启动:', errMsg);
            process.exit(1); // 终止进程（核心配置缺失,程序无法运行）
        }
    }

    /**
     * 异步保存技能配置到文件（核心改造：async + 异步IO）
     * - 不检查目录,失败仅报错不退出（逻辑不变）
     * @returns {Promise<void>} 保存完成的Promise
     */
    async save() {
        try {
            const config = {
                skill_names: this.skillNamesMap,
                last_updated: new Date().toISOString()
            };
            // 异步写入文件（替代 fs.writeFileSync）
            await fs.writeFile(this.configPath, JSON.stringify(config, null, 4));
            logger.info('技能配置已保存');
        } catch (err) {
            // 保存失败仅报错,不终止程序（逻辑不变）
            logger.error('⚠️ 技能配置保存失败:', err.message);
        }
    }

    // 以下业务方法完全不变（与IO无关,无需改造）
    /**
     * 更新技能名称映射表
     * @param {string|number} id - 技能ID
     * @param {string} name - 技能名称
     */
    update(id, name) {
        this.skillNamesMap[id] = name;
    }

    /**
     * 获取技能名称映射表（返回副本,避免外部直接修改原对象）
     * @returns {Object} 技能ID到名称的映射对象
     */
    getMap() {
        return { ...this.skillNamesMap }; // 新增：返回副本,防止外部篡改原数据
    }
}

module.exports = SkillNames;